home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Suzy B Software 2
/
Suzy B Software CD-ROM 2 (1994).iso
/
extras
/
programm
/
graphic
/
byte2raw.s
next >
Wrap
Text File
|
1995-04-27
|
24KB
|
717 lines
;*********************************************************************
;* Here contains 68K assembler source code to convert color byte *
;* information into data that is suitable for a system that *
;* displays color in a multiple plane configuration. This code *
;* assumes each plane is offset by 16 bits (2 bytes). *
;* Available Functions: *
;* *
;* int byte2raw8(char *color_data, char *buffer); 256 color *
;* int byte2raw4(char *color_data, char *buffer); 16 color *
;* int byte2raw2(char *color_data, char *buffer); 4 color *
;* int byte2raw1(char *color_data, char *buffer); 2 color *
;* Return value is the number of bytes written to the buffer. *
export byte2raw8
export byte2raw4
export byte2raw2
export byte2raw1
text
;*********************************************************************
;* This will convert byte color into 8 plane pixel color. *
;* Input 16 bytes of color information. *
;* Output 8 integers suitable for displaying on the ATARI. *
;*********************************************************************
;* Function:
;* int byte2raw8(char *color_data, char *buffer);
;* color_data will be converted and placed into location buffer.
;* color_data = A0. (Must be word aligned)
;* buffer = A1. (Must be word aligned)
byte2raw8:
movem.l D1-D7/A0-A2,-(A7) ; Save used registers.
moveq.l #0,D0 ; Now zero them out.
moveq.l #0,D1 ; Pixel color store here
moveq.l #0,D2 ; in registers D0-D3.
moveq.l #0,D3
move.l #$1, D5 ; Set up 'OR' mask.
move.l D5,D6
swap D6
adda.l #12,A0 ; Start at end of data.
; In order to plot the data in the correct order. We need
; to reverse the order of the 16 bytes of data.
move.l (A0),D4 ; Get the last 4 bytes
ror.w #8,D4 ; Convert to Intel format.
swap D4
ror.w #8,D4
move #3,D7 ; Loop 4 times (4 bytes).
.loop1:
lsl.l #1,D4 ; Bit was set?
bcc .b12 ; Branch if not.
or.l D5,D3 ; Set pixel on plane 7
.b12:
lsl.l #1,D4
bcc .b13
or.l D6,D3 ; Plane 6
.b13:
lsl.l #1,D4
bcc .b14
or.l D5,D2 ; Plane 5
.b14:
lsl.l #1,D4
bcc .b15
or.l D6,D2 ; Plane 4
.b15:
lsl.l #1,D4
bcc .b16
or.l D5,D1 ; Plane 3
.b16:
lsl.l #1,D4
bcc .b17
or.l D6,D1 ; Plane 2
.b17:
lsl.l #1,D4
bcc .b18
or.l D5,D0 ; Plane 1
.b18:
lsl.l #1,D4
bcc .b19
or.l D6,D0 ; Plane 0
.b19:
lsl.l D5 ; Shift odd and even plane
lsl.l D6 ; 'OR' mask.
dbf D7,.loop1 ; Branch if data still available.
suba.l #4,A0 ; Adjust data pointer to left
move.l (A0),D4 ; and get the 3rd 4 byte group.
ror.w #8,D4 ; Convert long word into Intel
swap D4 ; format.
ror.w #8,D4
move #3,D7 ; Set up loop counter.
.loop2:
lsl.l #1,D4
bcc .b22
or.l D5,D3 ; Plane 7
.b22:
lsl.l #1,D4
bcc .b23
or.l D6,D3 ; Plane 6
.b23:
lsl.l #1,D4
bcc .b24
or.l D5,D2 ; Plane 5
.b24:
lsl.l #1,D4
bcc .b25
or.l D6,D2 ; Plane 4
.b25:
lsl.l #1,D4
bcc .b26
or.l D5,D1 ; Plane 3
.b26:
lsl.l #1,D4
bcc .b27
or.l D6,D1 ; Plane 2
.b27:
lsl.l #1,D4
bcc .b28
or.l D5,D0 ; Plane 1
.b28:
lsl.l #1,D4
bcc .b29
or.l D6,D0 ; Plane 0
.b29:
lsl.l D5
lsl.l D6
dbf D7,.loop2
suba.l #4,A0 ; Adjust data pointer left and
move.l (A0),D4 ; get the 2nd 4 byte group.
ror.w #8,D4 ; Convert to Intel format.
swap D4
ror.w #8,D4
move #3,D7 ; Set up loop counter.
.loop3:
lsl.l #1,D4
bcc .b32
or.l D5,D3 ; Plane 7
.b32:
lsl.l #1,D4
bcc .b33
or.l D6,D3 ; Plane 6
.b33:
lsl.l #1,D4
bcc .b34
or.l D5,D2 ; Plane 5
.b34:
lsl.l #1,D4
bcc .b35
or.l D6,D2 ; Plane 4
.b35:
lsl.l #1,D4
bcc .b36
or.l D5,D1 ; Plane 3
.b36:
lsl.l #1,D4
bcc .b37
or.l D6,D1 ; Plane 2
.b37:
lsl.l #1,D4
bcc .b38
or.l D5,D0 ; Plane 1
.b38:
lsl.l #1,D4
bcc .b39
or.l D6,D0 ; Plane 0
.b39:
lsl.l D5
lsl.l D6
dbf D7,.loop3
suba.l #4,A0 ; Adjust data pointer left and
move.l (A0),D4 ; get the first 4 bytes.
ror.w #8,D4 ; Shift data to intel format.
swap D4
ror.w #8,D4
move #3,D7 ; Loop 4 times.
.loop4:
lsl.l #1,D4
bcc .b42
or.l D5,D3 ; Plane 7
.b42:
lsl.l #1,D4
bcc .b43
or.l D6,D3 ; Plane 6
.b43:
lsl.l #1,D4
bcc .b44
or.l D5,D2 ; Plane 5
.b44:
lsl.l #1,D4
bcc .b45
or.l D6,D2 ; Plane 4
.b45:
lsl.l #1,D4
bcc .b46
or.l D5,D1 ; Plane 3
.b46:
lsl.l #1,D4
bcc .b47
or.l D6,D1 ; Plane 2
.b47:
lsl.l #1,D4
bcc .b48
or.l D5,D0 ; Plane 1
.b48:
lsl.l #1,D4
bcc .b49
or.l D6,D0 ; Plane 0
.b49:
lsl.l D5
lsl.l D6
dbf D7,.loop4
move.l D0,(A1)+ ; Now move the data into
move.l D1,(A1)+ ; buffer.
move.l D2,(A1)+
move.l D3,(A1)
movem.l (A7)+,D1-D7/A0-A2 ; Restore used registers.
move.l #16,D0 ; Return number of bytes written.
rts ; Return to calling function.
;*********************************************************************
;* This will convert byte color into 4 plane pixel color. *
;* Input 16 bytes of color information. *
;* Output 4 integers suitable for displaying on the ATARI. *
;*********************************************************************
;* Function:
;* int byte2raw4(char *color_data, char *buffer);
;* color_data will be converted and placed into location buffer.
;* color_data = A0. (Must be word aligned)
;* buffer = A1. (Must be word aligned)
byte2raw4:
movem.l D2-D7/A0-A2,-(A7) ; Save used registers.
moveq.l #0,D2 ; in registers D0-D3.
moveq.l #0,D3
move.l #$1, D5 ; Set up 'OR' mask.
move.l D5,D6
swap D6
adda.l #12,A0 ; Start at end of data.
; In order to plot the data in the correct order. We need
; to reverse the order of the 16 bytes of data.
move.l (A0),D4 ; Get the last 4 bytes
ror.w #8,D4 ; Convert to Intel format.
swap D4
ror.w #8,D4
move #3,D7 ; Loop 4 times (4 bytes).
.loop1:
lsl.l #4,D4 ; First four bits unused.
lsl.l #1,D4 ; Bit was set?
bcc .b12 ; Branch if not.
or.l D5,D3 ; Set pixel on plane 3
.b12:
lsl.l #1,D4
bcc .b13
or.l D6,D3 ; Plane 2
.b13:
lsl.l #1,D4
bcc .b14
or.l D5,D2 ; Plane 1
.b14:
lsl.l #1,D4
bcc .b15
or.l D6,D2 ; Plane 0
.b15:
lsl.l D5 ; Shift odd and even plane
lsl.l D6 ; 'OR' mask.
dbf D7,.loop1 ; Branch if data still available.
suba.l #4,A0 ; Adjust data pointer to left
move.l (A0),D4 ; and get the 3rd 4 byte group.
ror.w #8,D4 ; Convert long word into Intel
swap D4 ; format.
ror.w #8,D4
move #3,D7 ; Set up loop counter.
.loop2:
lsl.l #4,D4 ; First 4 bits unused.
lsl.l #1,D4
bcc .b22
or.l D5,D3 ; Plane 3
.b22:
lsl.l #1,D4
bcc .b23
or.l D6,D3 ; Plane 2
.b23:
lsl.l #1,D4
bcc .b24
or.l D5,D2 ; Plane 1
.b24:
lsl.l #1,D4
bcc .b25
or.l D6,D2 ; Plane 0
.b25:
lsl.l D5
lsl.l D6
dbf D7,.loop2
suba.l #4,A0 ; Adjust data pointer left and
move.l (A0),D4 ; get the 2nd 4 byte group.
ror.w #8,D4 ; Convert to Intel format.
swap D4
ror.w #8,D4
move #3,D7 ; Set up loop counter.
.loop3:
lsl.l #4,D4 ; First 4 bits unused.
lsl.l #1,D4
bcc .b32
or.l D5,D3 ; Plane 3
.b32:
lsl.l #1,D4
bcc .b33
or.l D6,D3 ; Plane 2
.b33:
lsl.l #1,D4
bcc .b34
or.l D5,D2 ; Plane 1
.b34:
lsl.l #1,D4
bcc .b35
or.l D6,D2 ; Plane 0
.b35:
lsl.l D5
lsl.l D6
dbf D7,.loop3
suba.l #4,A0 ; Adjust data pointer left and
move.l (A0),D4 ; get the first 4 bytes.
ror.w #8,D4 ; Shift data to intel format.
swap D4
ror.w #8,D4
move #3,D7 ; Loop 4 times.
.loop4:
lsl.l #4,D4 ; First 4 bits unused.
lsl.l #1,D4
bcc .b42
or.l D5,D3 ; Plane 3
.b42:
lsl.l #1,D4
bcc .b43
or.l D6,D3 ; Plane 2
.b43:
lsl.l #1,D4
bcc .b44
or.l D5,D2 ; Plane 1
.b44:
lsl.l #1,D4
bcc .b45
or.l D6,D2 ; Plane 0
.b45:
lsl.l D5
lsl.l D6
dbf D7,.loop4
move.l D2,(A1)+ ; Now move the data into
move.l D3,(A1)+ ; buffer.
movem.l (A7)+,D2-D7/A0-A2 ; Restore used registers.
move.l #8,D0 ; Number of bytes written.
rts ; Return to calling function.
;*********************************************************************
;* This will convert byte color into 2 plane pixel color. *
;* Input 16 bytes of color information. *
;* Output 2 integers suitable for displaying on the ATARI. *
;*********************************************************************
;* Function:
;* int byte2raw2(char *color_data, char *buffer);
;* color_data will be converted and placed into location buffer.
;* color_data = A0. (Must be word aligned)
;* buffer = A1. (Must be word aligned)
byte2raw2:
movem.l D3-D7/A0-A2,-(A7) ; Save used registers.
moveq.l #0,D3 ; in registers D0-D3.
move.l #$1, D5 ; Set up 'OR' mask.
move.l D5,D6
swap D6
adda.l #12,A0 ; Start at end of data.
; In order to plot the data in the correct order. We need
; to reverse the order of the 16 bytes of data.
move.l (A0),D4 ; Get the last 4 bytes
ror.w #8,D4 ; Convert to Intel format.
swap D4
ror.w #8,D4
move #3,D7 ; Loop 4 times (4 bytes).
.loop1:
lsl.l #6,D4 ; First four bits unused.
lsl.l #1,D4 ; Bit was set?
bcc .b12 ; Branch if not.
or.l D5,D3 ; Set pixel on plane 1
.b12:
lsl.l #1,D4
bcc .b13
or.l D6,D3 ; Plane 0
.b13:
lsl.l D5 ; Shift odd and even plane
lsl.l D6 ; 'OR' mask.
dbf D7,.loop1 ; Branch if data still available.
suba.l #4,A0 ; Adjust data pointer to left
move.l (A0),D4 ; and get the 3rd 4 byte group.
ror.w #8,D4 ; Convert long word into Intel
swap D4 ; format.
ror.w #8,D4
move #3,D7 ; Set up loop counter.
.loop2:
lsl.l #6,D4 ; First 6 bits unused.
lsl.l #1,D4
bcc .b22
or.l D5,D3 ; Plane 1
.b22:
lsl.l #1,D4
bcc .b23
or.l D6,D3 ; Plane 0
.b23:
lsl.l D5
lsl.l D6
dbf D7,.loop2
suba.l #4,A0 ; Adjust data pointer left and
move.l (A0),D4 ; get the 2nd 4 byte group.
ror.w #8,D4 ; Convert to Intel format.
swap D4
ror.w #8,D4
move #3,D7 ; Set up loop counter.
.loop3:
lsl.l #6,D4 ; First 6 bits unused.
lsl.l #1,D4
bcc .b32
or.l D5,D3 ; Plane 1
.b32:
lsl.l #1,D4
bcc .b33
or.l D6,D3 ; Plane 0
.b33:
lsl.l D5
lsl.l D6
dbf D7,.loop3
suba.l #4,A0 ; Adjust data pointer left and
move.l (A0),D4 ; get the first 4 bytes.
ror.w #8,D4 ; Shift data to intel format.
swap D4
ror.w #8,D4
move #3,D7 ; Loop 4 times.
.loop4:
lsl.l #6,D4 ; First 4 bits unused.
lsl.l #1,D4
bcc .b42
or.l D5,D3 ; Plane 3
.b42:
lsl.l #1,D4
bcc .b43
or.l D6,D3 ; Plane 2
.b43:
lsl.l D5
lsl.l D6
dbf D7,.loop4
move.l D3,(A1) ; Now move the data into
; buffer.
movem.l (A7)+,D3-D7/A0-A2 ; Restore used registers.
move.l #4,D0 ; Number of bytes written.
rts ; Return to calling function.
;*********************************************************************
;* This will convert byte color into 2 plane pixel color. *
;* Input 16 bytes of color information. *
;* Output 1 integers suitable for displaying on the ATARI. *
;*********************************************************************
;* Function:
;* int byte2raw1(char *color_data, char *buffer);
;* color_data will be converted and placed into location buffer.
;* color_data = A0. (Must be word aligned)
;* buffer = A1. (Must be word aligned)
byte2raw1:
movem.l D3-D7/A0-A2,-(A7) ; Save used registers.
moveq.l #0,D3 ; Zero register D3.
; In order to plot the data in the correct order. We need
; to reverse the order of the 16 bytes of data.
adda.l #12,A0 ; Start at end of data.
move.l (A0),D4 ; Get the last 4 bytes
ror.w #8,D4 ; Convert to Intel format.
swap D4
ror.w #8,D4
move.l #$1, D5 ; Set up 'OR' mask.
lsl.l #7,D4 ; First 7 bits unused.
lsl.l #1,D4 ; Bit was set?
bcc .b12 ; Branch if not.
or.l D5,D3 ; Set pixel on plane 1
.b12:
lsl.l D5 ; Shift 'OR' mask.
lsl.l #7,D4 ; First 7 bits unused.
lsl.l #1,D4 ; Bit was set?
bcc .b13 ; Branch if not.
or.l D5,D3 ; Set pixel on plane 1
.b13:
lsl.l D5 ; Shift 'OR' mask.
lsl.l #7,D4 ; First 7 bits unused.
lsl.l #1,D4 ; Bit was set?
bcc .b14 ; Branch if not.
or.l D5,D3 ; Set pixel on plane 1
.b14:
lsl.l D5 ; Shift 'OR' mask.
lsl.l #7,D4 ; First 7 bits unused.
lsl.l #1,D4 ; Bit was set?
bcc .b15 ; Branch if not.
or.l D5,D3 ; Set pixel on plane 1
.b15:
subq.l #4,A0
move.l (A0),D4 ; Get 4 bytes
ror.w #8,D4 ; Convert to Intel format.
swap D4
ror.w #8,D4
lsl.l D5 ; Shift 'OR' mask.
lsl.l #7,D4 ; First 7 bits unused.
lsl.l #1,D4 ; Bit was set?
bcc .b22 ; Branch if not.
or.l D5,D3 ; Set pixel on plane 1
.b22:
lsl.l D5 ; Shift 'OR' mask.
lsl.l #7,D4 ; First 7 bits unused.
lsl.l #1,D4 ; Bit was set?
bcc .b23 ; Branch if not.
or.l D5,D3 ; Set pixel on plane 1
.b23:
lsl.l D5 ; Shift 'OR' mask.
lsl.l #7,D4 ; First 7 bits unused.
lsl.l #1,D4 ; Bit was set?
bcc .b24 ; Branch if not.
or.l D5,D3 ; Set pixel on plane 1
.b24:
lsl.l D5 ; Shift 'OR' mask.
lsl.l #7,D4 ; First 7 bits unused.
lsl.l #1,D4 ; Bit was set?
bcc .b25 ; Branch if not.
or.l D5,D3 ; Set pixel on plane 1
.b25:
subq.l #4,A0
move.l (A0),D4 ; Get 4 bytes
ror.w #8,D4 ; Convert to Intel format.
swap D4
ror.w #8,D4
lsl.l D5 ; Shift 'OR' mask.
lsl.l #7,D4 ; First 7 bits unused.
lsl.l #1,D4 ; Bit was set?
bcc .b32 ; Branch if not.
or.l D5,D3 ; Set pixel on plane 1
.b32:
lsl.l D5 ; Shift 'OR' mask.
lsl.l #7,D4 ; First 7 bits unused.
lsl.l #1,D4 ; Bit was set?
bcc .b33 ; Branch if not.
or.l D5,D3 ; Set pixel on plane 1
.b33:
lsl.l D5 ; Shift 'OR' mask.
lsl.l #7,D4 ; First 7 bits unused.
lsl.l #1,D4 ; Bit was set?
bcc .b34 ; Branch if not.
or.l D5,D3 ; Set pixel on plane 1
.b34:
lsl.l D5 ; Shift 'OR' mask.
lsl.l #7,D4 ; First 7 bits unused.
lsl.l #1,D4 ; Bit was set?
bcc .b35 ; Branch if not.
or.l D5,D3 ; Set pixel on plane 1
.b35:
subq.l #4,A0
move.l (A0),D4 ; Get 4 bytes
ror.w #8,D4 ; Convert to Intel format.
swap D4
ror.w #8,D4
lsl.l D5 ; Shift 'OR' mask.
lsl.l #7,D4 ; First 7 bits unused.
lsl.l #1,D4 ; Bit was set?
bcc .b42 ; Branch if not.
or.l D5,D3 ; Set pixel on plane 1
.b42:
lsl.l D5 ; Shift 'OR' mask.
lsl.l #7,D4 ; First 7 bits unused.
lsl.l #1,D4 ; Bit was set?
bcc .b43 ; Branch if not.
or.l D5,D3 ; Set pixel on plane 1
.b43:
lsl.l D5 ; Shift 'OR' mask.
lsl.l #7,D4 ; First 7 bits unused.
lsl.l #1,D4 ; Bit was set?
bcc .b44 ; Branch if not.
or.l D5,D3 ; Set pixel on plane 1
.b44:
lsl.l D5 ; Shift 'OR' mask.
lsl.l #7,D4 ; First 7 bits unused.
lsl.l #1,D4 ; Bit was set?
bcc .b45 ; Branch if not.
or.l D5,D3 ; Set pixel on plane 1
.b45:
move.w D3,(A1) ; Now move the data into
; buffer.
movem.l (A7)+,D3-D7/A0-A2 ; Restore used registers.
move.l #2,D0 ; Number of bytes written.
rts ; Return to calling function.
end_loop:
bra end_loop ; just in case.
end